﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace Toto.Componentes
{
    class Eixo
    {
        Texture2D imagem, jogador, manete;
        Colisao colisao;
        Vector2 posicao, posicao2; //posicao = Eixo; posicao2 = manete;
        public Vector2 Posicao
        {
            get { return this.posicao; }
            set { this.posicao = value; }
        }
        List<Boneco> bonecos;
        List<Keys> teclas;
        public int direction;
        public int direction2;
        Random rnd = new Random(DateTime.Now.Millisecond);
        public int randomico;
        bool time; //time Azul = true time Verde = false
        const int Margem = 135; //margem do final do campo ate o fim da tela de jogo.

        //Posição Rectangulo
        public int Posi1 = 27;
        public int Posi2 = 27;
        public int meuTime = 0;

        /// <summary>
        /// Contrutor do Eixo.
        /// </summary>
        /// <param name="texturaEixo">Textura correspondente ao eixo</param>
        /// <param name="posicao">Posição inicial do eixo</param>
        /// <param name="gameWindow">Janela do jogo</param>
        /// <param name="numeroDeBonecos">Número de bonecos contidos no eixo</param>
        /// <param name="texturaJogador">Textura correspondente aos bonecos do eixo</param>
        /// <param name="teclas">Lista com três elementos contendo as teclas usadas para mover o eixo</param>
        public Eixo(bool time, Vector2 posicao, int numeroDeBonecos, int texturaJogador, List<Keys> teclas)
        {
            //Carrega atributos básicos do eixo
            this.imagem = Textura.texturaBarra;
            this.posicao = posicao;

            if (texturaJogador == 1)
            {
                this.manete = Textura.texturaManete2;
                posicao2 = new Vector2(posicao.X - 10, posicao.Y + 22 + imagem.Height);
                this.jogador = Textura.texturaBoneco;
                meuTime = 1;
            }
            else
            {
                this.manete = Textura.texturaManete;
                posicao2 = new Vector2(posicao.X - 10, posicao.Y + 30 - Margem);
                this.jogador = Textura.texturaBoneco2;
                meuTime = 2;
            }
            //Calcula o espaçamento entre os bonecos
            int espacamento = (int)(this.imagem.Height - (numeroDeBonecos * this.jogador.Height)) / (numeroDeBonecos + 1);

            //Cria e popula a lista de bonecos correspondente ao eixo, colocando os bonecos na posição correta
            this.bonecos = new List<Boneco>();
            for (int i = 0; i < numeroDeBonecos; i++)
                if (time)
                {
                    //this.bonecos.Add(new Boneco(texturaJogador, new Vector2(posicao.X + 2 + texturaEixo.Width / 2 - texturaJogador.Width / 2, espacamento * (i + 1) + texturaJogador.Height * i), new Rectangle(0, 0, 38, 33)));
                    this.bonecos.Add(new Boneco(texturaJogador, new Vector2(posicao.X + 6 + this.imagem.Width / 2 - 38 / 2, espacamento * (i + 1) + this.jogador.Height * i + Margem - 7), new Rectangle(Posi1, 0, Posi2, 30)));
                }
                else
                {
                    this.bonecos.Add(new Boneco(texturaJogador, new Vector2(posicao.X + 2 + this.imagem.Width / 2 - 38 / 2, espacamento * (i + 1) + this.jogador.Height * i + Margem - 7), new Rectangle(Posi1, 0, Posi2, 30)));
                }

            //Cria uma lista de teclas padrão, caso falte teclas na lista recebida
            this.teclas = new List<Keys>() { Keys.Up, Keys.Down, Keys.D1 };
            //Substitui a lista padrão pela lista recebida por parâmetro
            for (int i = 0; i < teclas.Count; i++)
                this.teclas[i] = teclas[i];
        }

        /// <summary>
        /// Atualiza a posição do eixo e dos bonecos nele contidos.
        /// </summary>
        public void Update(ref Bola pelota, GameTime gameTime)        
        {            
            //Verifica se a tecla de seleção do eixo está pressionada
            if (Keyboard.GetState().IsKeyDown(this.teclas[2]))
            {
                //Verifica o comando desejado e move os bonecos ao longo do eixo
                if (Keyboard.GetState().IsKeyDown(this.teclas[0]))
                {
                    foreach (Boneco boneco in bonecos)
                    {
                        boneco.Posicao -= new Vector2(0, 10);
                    }
                }
                if (Keyboard.GetState().IsKeyDown(this.teclas[1]))
                {
                    foreach (Boneco boneco in bonecos)
                    {
                        boneco.Posicao += new Vector2(0, 10);
                    }
                }
                // Controla o teclado para o player 1
                if (meuTime == 1) 
                {
                    if (Keyboard.GetState().IsKeyDown(Keys.Right))
                    {
                        colisao = new Colisao();
                        foreach (Boneco boneco in bonecos)
                        {
                            if (boneco.retangulo.X < 76)
                            {
                                boneco.retangulo = new Rectangle(53,0,30,30); 
                                boneco.chute += 1;
                                boneco.Update(gameTime);
                                colisao.colidiuChute(boneco, pelota);
                            }
                        }   
                   }
                   else
                   {
                        foreach (Boneco boneco in bonecos)
                        {
                            boneco.retangulo = new Rectangle(27,0,27,30);
                            boneco.chute = 1;
                        
                        }
                   }
                }
                // Controla o teclado para o player 2
                if(meuTime == 2)
                {
                    if (Keyboard.GetState().IsKeyDown(Keys.Left))
                    {
                        colisao = new Colisao();
                        foreach (Boneco boneco in bonecos)
                        {
                            if (boneco.retangulo.X < 76)
                            {
                                boneco.retangulo = new Rectangle(0, 0, 30, 30);
                                boneco.chute += 1;
                                boneco.Update(gameTime);
                                colisao.colidiuChute(boneco, pelota);
                            }
                        }
                    }
                    else
                    {
                        foreach (Boneco boneco in bonecos)
                        {
                            boneco.retangulo = new Rectangle(27, 0, 27, 30);
                            boneco.chute = 1;
                        }
                    }
                }
                if (Keyboard.GetState().IsKeyUp(this.teclas[2]))
                {
                    foreach (Boneco boneco in bonecos)
                    {
                        boneco.retangulo = new Rectangle(27, 0, 27, 30);
                        boneco.chute = 1;

                    }
                }

                //Impede que os bonecos saiam da tela
                //Margem referente a distancia do topo da tela até o inicio do campo.
                if (bonecos[0].Posicao.Y < this.Posicao.Y)
                {
                    Vector2 temp = new Vector2(0, bonecos[0].Posicao.Y - this.Posicao.Y);
                    foreach (Boneco boneco in bonecos)
                    {
                        boneco.Posicao -= temp;
                    }
                }
                if (bonecos[bonecos.Count - 1].Posicao.Y > this.Posicao.Y + this.imagem.Height - bonecos[bonecos.Count - 1].bTextura.Height + 5 )
                {
                    Vector2 temp = new Vector2(0, bonecos[bonecos.Count - 1].Posicao.Y + bonecos[bonecos.Count - 1].bTextura.Height - this.imagem.Height - Margem + 10 );
                    foreach (Boneco boneco in bonecos)
                    {
                        boneco.Posicao -= temp;
                    }
                }
            }          

            if (Keyboard.GetState().IsKeyDown(Keys.End))
            {
                //Reposiciona a bola no meio e lança ela aleatoriamente pra 
                //uma das 4 diagonais e "recarega" a velocidade pra inicial
                pelota.position = new Vector2(pelota.campo.Width / 2 - pelota.imagem.Height / 2 + pelota.campo.X,
                                               pelota.campo.Height / 2 - pelota.imagem.Height / 2 + pelota.campo.Y);
                randomico = rnd.Next(100);
                if (randomico > 50) { direction = -1; pelota.speed = 150.0f; }
                else { direction = +1; pelota.speed = 150.0f; }
                randomico = rnd.Next(100);
                if (randomico > 50) { direction2 = -1; pelota.speed = 150.0f; }
                else { direction2 = +1; pelota.speed = 150.0f; }
                pelota.Direction = new Vector2(direction * 5, direction2 * 5);   
            }
            //FAZER A BOLA BATER COM INTELIGENCIA EM UM BONECO
            colisao = new Colisao();
            foreach (Boneco boneco in bonecos)
            {
                boneco.Update(gameTime);
                colisao.colidiu(boneco, pelota);
            }
        }

        /// <summary>
        /// Desenha o eixo e os bonecos nele contidos.
        /// </summary>
        /// <param name="spriteBatch">spriteBatch</param>
        /// <param name="gameTime">gameTime</param>
        public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
        {
            spriteBatch.Draw(imagem, posicao, Color.White);
            spriteBatch.Draw(manete, posicao2, Color.White);
            foreach (Boneco boneco in bonecos)
            {
                boneco.Draw(spriteBatch);
            }
        }
    }
}
